/**
 * 
 */
package com.rhf.core.db.implementations.postgresql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.rhf.core.db.implementations.Base;
import com.rhf.core.dto.CategorieVO;

/**
 * @author fabiensaulnier
 * 
 */
public class CategorieImp extends Base implements com.rhf.core.db.interfaces.Categorie {

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rhf.core.db.interfaces.Categorie#contructeur(java.sql.ResultSet)
	 */
	public CategorieVO contructeur(ResultSet rs) throws Exception {

		CategorieVO categorieVO = new CategorieVO();

		try {

			categorieVO.setCategorieId(rs.getInt("categorie_id"));
			categorieVO.setLibelle(rs.getString("libelle"));

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		}

		return categorieVO;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rhf.core.db.interfaces.Categorie#ajouterCategorie(com.rhf.core.db.valuesobjects.CategorieVO)
	 */
	public int ajouterCategorie(CategorieVO categorieVO) throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		int nbLigneAffecte = 0;

		// Requête SQL
		String query = "INSERT INTO categorie ";
		query += "(libelle) ";
		query += "VALUES (?)";

		try {

			// Connexion à la base de données
			conn = super.getConnection();
			stmt = conn.prepareStatement(query);

			// Définition des paramètres (?)
			stmt.setString(1, categorieVO.getLibelle());

			// Exécution de la requête
			this.appLog.debug(stmt.toString());
			nbLigneAffecte = stmt.executeUpdate();

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			super.closeResources(null, stmt, conn);
		}

		return nbLigneAffecte;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rhf.core.db.interfaces.Categorie#modifierCategorie(com.rhf.core.db.valuesobjects.CategorieVO)
	 */
	public int modifierCategorie(CategorieVO categorieVO) throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		int nbLigneAffecte = 0;

		// Requête SQL
		String query = "UPDATE categorie ";
		query += "SET libelle = ? ";
		query += "WHERE categorie_id = ?";

		try {

			// Connexion à la base de données
			conn = super.getConnection();
			stmt = conn.prepareStatement(query);

			// Définition des paramètres (?)
			int i = 1;
			stmt.setString(i++, categorieVO.getLibelle());
			stmt.setInt(i++, categorieVO.getCategorieId());

			// Exécution de la requête
			this.appLog.debug(stmt.toString());
			nbLigneAffecte = stmt.executeUpdate();

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			super.closeResources(null, stmt, conn);
		}

		return nbLigneAffecte;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rhf.core.db.interfaces.Categorie#recupererListeCategorie()
	 */
	public List<CategorieVO> recupererListeCategorie() throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		List<CategorieVO> list = null;

		// Requête SQL
		String query = "SELECT * FROM categorie ORDER BY libelle";

		try {

			// Connexion à la base de données
			conn = super.getConnection();
			stmt = conn.prepareStatement(query);

			// Exécution de la requête
			this.appLog.debug(stmt.toString());
			rs = stmt.executeQuery();

			// Traitement des données
			if (rs.next()) {
				list = new ArrayList<CategorieVO>();
				list.add(this.contructeur(rs));
				while (rs.next()) {
					list.add(this.contructeur(rs));
				}
			}

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			super.closeResources(null, stmt, conn);
		}

		return list;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rhf.core.db.interfaces.Categorie#supprimerCategorie(int)
	 */
	public int supprimerCategorie(int categorieId) throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		int nbLigneAffecte = 0;

		// Requête SQL
		String query = "DELETE FROM categorie ";
		query += "WHERE categorie_id = ? ";

		try {

			// Connexion à la base de données
			conn = super.getConnection();
			stmt = conn.prepareStatement(query);

			// Définition des paramètres (?)
			stmt.setInt(1, categorieId);

			// Exécution de la requête
			this.appLog.debug(stmt.toString());
			nbLigneAffecte = stmt.executeUpdate();

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			super.closeResources(null, stmt, conn);
		}

		return nbLigneAffecte;
	}

}
